#include"queue.h"


//
//队列的初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;

}



//队列的增（尾插）
void QueuePush(Queue* pq, QuDataType x)
{
	assert(pq);

	//为新节点申请空间
	QNode* newnode = (QNode*)malloc(sizeof(QNode));	//melloc函数只需要传要开辟的空间大小(变量大小而不是指针大小)即可
	//判断节点是否申请成功
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	//对新节点进行初始化
	newnode->next = NULL;
	newnode->val = x;

	//如果原链表为空
	if (pq->ptail == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;  //让新节点与原链表建立关系
		pq->ptail = newnode;
	}

	pq->size++;
}




//队列的删（头删）
void QueuePop(Queue* pq) 
{
	assert(pq);
	assert(pq->ptail != NULL);

	//如果链表只有一个节点
	if (pq->size == 1)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	//如果链表有多个节点
	else
	{
		QNode* Next = pq->phead->next;
		free(pq->phead);
		pq->phead = Next;
	}

	pq->size--;
}




//队列返回队头
QuDataType QueueHead(Queue* pq)
{	
	assert(pq);
	assert(pq->ptail != NULL);
	return pq->phead->val;	//返回队头的值
}


//队列返回队尾
QuDataType Queuetail(Queue* pq) 
{
	assert(pq);
	assert(pq->ptail != NULL);
	return pq->ptail->val;	//返回队尾的值

}


//队列的判空
bool QueueEmpty(Queue* pq) 
{
	assert(pq);
	return pq->size == 0;	//队列为空返回TRUE 不为空返回FALSE
}

//队列的销毁
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while(cur)
	{
		QNode* Next = cur->next;	//为了free掉cur之后还能找到cur->next
		free(cur);
		cur = Next;
	}
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

//队列的大小
int QueueSize(Queue* pq) 
{
	assert(pq);
	return pq->size;
}